<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // promise API

        // 1. 定义promise对象
        // 1.1 定时执行器函数（同步执行）
        // 1.1.1 执行异步操作
        // 1.1.1.1 调用resolve、reject函数
        // let p = new Promise((resolve,reject)=>{
        //     resolve(123);
        // });

        // // then方法 一定会返回 promise对象！
        // let p2 =  p.then(val=>{
        //     console.log(val);
        //     // 未改变的状态的promise - pending
        //     // return new Promise((resolve,reject)=>{
        //     //     // resolve(111);
        //     //     // reject(222);
        //     // })
        //     // throw 'error'
        //     // return  123;
        // });

        // console.log(p2); //pending状态


        // const p1 = new Promise((resolve, reject) => {
        //     resolve("success");
        //     // reject('error');
        // });
		// //在使用then时未传递成功回调
        // const p2 = p1.then(); //如果then内部没有定义回调-则promise会将状态及结果向下传递
        // p2.catch((rea)=>{
        //     console.log(rea);
        // }).then(val=>{
        //     console.log(val);
        // });
        // console.log(p2);


        // 2. 调用promise的then方法
        // 2.1 定义resolve、reject回调（异步执行）

        // 3. 测试then方法下的resolve、reject函数异步执行

        // 4. 打印调用then方法的返回值 - 是一个新的pormise对象
        // 4.1 在使用then时未传递成功回调
        // 4.1.1 如果是成功的promise, - then返回promise（状态：成功，结果值：resolve参数）
        // 4.1.2 如果是失败的promise，- then返回promise（状态：失败，结果值：reject参数）

        // 5. 在使用then时传递回调函数
            // 5.1 未定义回调函数的return
                // 5.1.1 默认返回的是一个新的promise（默认状态:成功，结果值:undefined）
            // 5.2 自定义回调函数的return
                // 5.2.1 return 非promise对象
                // 5.2.2 return promise对象
                // 5.2.3 抛出错误

        // 6. 创建一个promise实例 - 执行器内不改变状态
        // 6.1 调用promise的then方法 - 查看返回对象（状态：pending，值：undefined）
        // let p = new Promise((resolve,reject)=>{
        //     resolve('success');
        // });

        // let p2 =  p.then(val=>{
        //     return new Promise((res,rej)=>{

        //     });
        // });
        
        // console.log(p2);



        //什么情况下 then的返回值 - 都必须是一个promise
       
        let p = new Promise((res,rej)=>{
            res(123);
        });

        // 类：返回的都是非promise对象
         // 1. 情况1  默认情况：返回成功的promise，结果值 undefined
        // let p2 = p.then(val=>{
        //     console.log(val);
        // });

        // 2. 情况2 返回成功的promise 结果值：123
        // let p2 = p.then(val=>{
        //     console.log(val);
        //     return 123;
        // });

        // 3. 情况3  返回成功的promise 结果值：[1,2,3]
        // let p2 = p.then(val=>{
        //     console.log(val);
        //     return [1,2,3];
        // });

        // 4. 情况4: 返回成功的promise 结果值：{name:"laowang"}
        // let p2 = p.then(val=>{
        //     console.log(val);
        //     return {name:"laowang"};
        // });

        // 5. 情况5：返回成功的promise 结果值：fn()
        // let p2 = p.then(val=>{
        //     console.log(val);
        //     return function(){
        //         console.log(val);
        //     };
        // });

        // 类：返回promise
        // 情况6：返回等待（pending）的promise 结果值：undefined
        // let p2 = p.then(val=>{
        //     console.log(val);
        //     return new Promise(()=>{});
        // });

        // 情况7：返回成功的promise 结果值：success
        // let p2 = p.then(val=>{
        //     console.log(val);
        //     return new Promise((res)=>{
        //         res("success")
        //     });
        // });

        // 情况8：返回失败的promise 结果值：success
        // let p2 = p.then(val=>{
        //     console.log(val);
        //     return new Promise((res,rej)=>{
        //         rej("error")
        //     });
        // });


        // 类：抛出错误
        // 情况9：返回失败的promise 结果值："错误"
        // let p2 = p.then(val=>{
        //     console.log(val);
        //     throw "错误"
        // });



        // 情况10：返回成功的promise 结果值：123
        // let p2 = p.then(val=>{
        //     console.log(val);
        //     throw "错误"
        // }).then(undefined,rea=>{
        //     console.log(rea);
        //     return 123;
        // });


        // 情况11：返回失败的pormise 结果值：错误
        // let p2 = p.then(val=>{
        //     console.log(val);
        //     throw "错误"
        // })
        
        // // 返回成功的promise 结果值：123
        // let p3 = p2.then(undefined,rea=>{
        //     console.log(rea);
        //     return 123;
        // });

        // 情况12：打回车不影响 then方法执行
        let p2 = p.then(val=>{
            console.log(val);
            throw "错误"
        })
        .then(undefined,rea=>{
            console.log(rea);
            return 123;
        });
        

        console.log(p2);

        




    </script>
</body>

</html>